const p1 = new Promise(function (resolve, reject) {
    setTimeout(() => reject(new Error('fail')), 5000)
})

const p2 = new Promise(function (resolve, reject) {
    setTimeout(() => reject(p1), 3000)
})

const p3 = new Promise((resolve, reject) => {
    /**
     * 在 Promise 中 resolve 或 reject 另外一个 Promise 实例
     * 如果是 resolve 的话，当前 Promise 实例的状态就会由另外一个 Promise 实例决定
     * 如果是 reject 的话，则一切照旧
     */
    setTimeout(() => { resolve(p2) }, 1000)
})

p3
    .then(result => {
        console.log('then')
        console.log(result)
    })
    .catch(error => {
        console.log('error')
        console.log(error)
    })

const p4 = new Promise((resolve, reject) => {
    /**
     * reject 和 throw 都会将当前 Promise 实例 rejected 化
     * 两者的参数会成为 PromiseResult
     * 唯一不同的是：reject 之后的代码依旧会执行，throw 之后的代码就不会执行了
     * Promise 实例如果没有设置 then 方法的失败回调和 catch 方法的回调，默认会将 PromiseResult 作为异常抛出
     */

    // reject(1000)
    throw new Error('error')

    console.log('执行到此？')
}).then(res => { }, err => { })

const p5 = new Promise((resolve, reject) => {
    /**
     * 与 _Promise_ 行为一致，因为异步错过了 catch，导致 Promise 实例永远处于 pending 状态
     */
    setTimeout(() => {
        throw new Error('error')
    }, 1000)
})

const p6 = new _Promise_((resolve, reject) => {
    setTimeout(() => {
        resolve(1000)
    }, 1000)
}).then(res => {
    return new _Promise_((resolve, reject) => {
        setTimeout(() => {
            resolve(res * 2)
        }, 4000)
    })
}).then(res => {
    console.log(res)
})